/*
 *    This file is part of BlobDB.
 *
 *    BlobDB is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation, either version 3 of the License, or
 *    (at your option) any later version.
 *
 *    BlobDB is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with BlobDB.  If not, see <http://www.gnu.org/licenses/>.
 *    
 *    Copyright(c) 2011 Michael Kankkonen
 *    http://www.vnetcon.org
 */


package org.vnetcon.blobdb.driver.jdbc;

import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.Date;
import java.sql.NClob;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.Ref;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.RowId;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;

public class BlobDBPreparedStatement extends BlobDBStatement implements PreparedStatement {

	private String bSQL = null;
	
	public BlobDBPreparedStatement(org.vnetcon.blobdb.database.Statement nativeStatement, String bSQL){
		super(nativeStatement);
		this.bSQL = this.markParams(bSQL);
	}

	private String markParams(String bSQL){
		String strRet = bSQL;
		int i = 1;
		while(strRet.indexOf(" ? ") > -1){
			strRet = strRet.replaceFirst(" \\? ", " " + i + "? ");
			i++;
		}
		return strRet;
	}

	private void insertParam(int param, String value){
		this.bSQL = this.bSQL.replace(" " + param + "? ", " '" + value + "'");
	}
	
	@Override
	public void addBatch() throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void clearParameters() throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public boolean execute() throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public ResultSet executeQuery() throws SQLException {
		return super.executeQuery(this.bSQL);
	}

	@Override
	public int executeUpdate() throws SQLException {
		return super.executeUpdate(this.bSQL);
	}

	@Override
	public ResultSetMetaData getMetaData() throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public ParameterMetaData getParameterMetaData() throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setArray(int parameterIndex, Array x) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setAsciiStream(int parameterIndex, InputStream x)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setAsciiStream(int parameterIndex, InputStream x, int length)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setAsciiStream(int parameterIndex, InputStream x, long length)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setBigDecimal(int parameterIndex, BigDecimal x)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setBinaryStream(int parameterIndex, InputStream x)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setBinaryStream(int parameterIndex, InputStream x, int length)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setBinaryStream(int parameterIndex, InputStream x, long length)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setBlob(int parameterIndex, Blob x) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setBlob(int parameterIndex, InputStream inputStream)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setBlob(int parameterIndex, InputStream inputStream, long length)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setBoolean(int parameterIndex, boolean x) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setByte(int parameterIndex, byte x) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setBytes(int parameterIndex, byte[] x) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setCharacterStream(int parameterIndex, Reader reader)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setCharacterStream(int parameterIndex, Reader reader, int length)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setCharacterStream(int parameterIndex, Reader reader,
			long length) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setClob(int parameterIndex, Clob x) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setClob(int parameterIndex, Reader reader) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setClob(int parameterIndex, Reader reader, long length)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setDate(int parameterIndex, Date x) throws SQLException {
		Calendar cal = Calendar.getInstance();
		cal.setTime(x);
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int date = cal.get(Calendar.DATE);
		String buf = "" + year;
		
		if(month < 10){
			buf += "0" + month;
		}else{
			buf += "" + month;
		}
		
		if(date < 10){
			buf += "0" + date;
		}else{
			buf += "" + date;
		}
		this.insertParam(parameterIndex, buf);
	}

	@Override
	public void setDate(int parameterIndex, Date x, Calendar cal)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setDouble(int parameterIndex, double x) throws SQLException {
		this.insertParam(parameterIndex, "" + x);
	}

	@Override
	public void setFloat(int parameterIndex, float x) throws SQLException {
		this.insertParam(parameterIndex, "" + x);
	}

	@Override
	public void setInt(int parameterIndex, int x) throws SQLException {
		this.insertParam(parameterIndex, "" + x);
	}

	@Override
	public void setLong(int parameterIndex, long x) throws SQLException {
		this.insertParam(parameterIndex, "" + x);
	}

	@Override
	public void setNCharacterStream(int parameterIndex, Reader value)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setNCharacterStream(int parameterIndex, Reader value,
			long length) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setNClob(int parameterIndex, NClob value) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setNClob(int parameterIndex, Reader reader) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setNClob(int parameterIndex, Reader reader, long length)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setNString(int parameterIndex, String value)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setNull(int parameterIndex, int sqlType) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setNull(int parameterIndex, int sqlType, String typeName)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setObject(int parameterIndex, Object x) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setObject(int parameterIndex, Object x, int targetSqlType)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setObject(int parameterIndex, Object x, int targetSqlType,
			int scaleOrLength) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setRef(int parameterIndex, Ref x) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setRowId(int parameterIndex, RowId x) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setSQLXML(int parameterIndex, SQLXML xmlObject)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setShort(int parameterIndex, short x) throws SQLException {
		this.insertParam(parameterIndex, "" + x);
	}

	@Override
	public void setString(int parameterIndex, String x) throws SQLException {
		this.insertParam(parameterIndex, x);
	}

	@Override
	public void setTime(int parameterIndex, Time x) throws SQLException {
		Calendar cal = Calendar.getInstance();
		cal.setTime(x);
		int hour = cal.get(Calendar.YEAR);
		int min = cal.get(Calendar.MONTH) + 1;
		int sec = cal.get(Calendar.DATE);
		String buf = "";

		if(hour < 10){
			buf += "0" + hour;
		}else{
			buf += "" + hour;
		}
		
		if(min < 10){
			buf += "0" + min;
		}else{
			buf += "" + min;
		}
		
		if(sec < 10){
			buf += "0" + sec;
		}else{
			buf += "" + sec;
		}
		this.insertParam(parameterIndex, buf);
	}

	@Override
	public void setTime(int parameterIndex, Time x, Calendar cal)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setTimestamp(int parameterIndex, Timestamp x)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setURL(int parameterIndex, URL x) throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public void setUnicodeStream(int parameterIndex, InputStream x, int length)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	@Override
	public String toString(){
		return super.toString();
	}
	

}
